package queue;

import java.util.concurrent.LinkedTransferQueue;

/**
 * @author: 李德才
 * @description:
 * @create: 2020-12-13 20:44
 **/
public class Test_TransferQueue {

    /**
     * 队列LinkedTransferQueue和SynchronousQueue有些类似，
     * 但LinkedTransferQueue可以使用put、tryTransfer、transfer添加多个数据而不用等别的线程来获取。
     * tryTransfer和transfer与put不同的是，tryTransfer和transfer可以检测是否有线程在等待获取数据，
     * 如果检测到就立即发送新增的数据给这个线程获取而不用放入队列。
     * 所以当使用tryTransfer和transfer往LinkedTransferQueue添加多个数据的时候，
     * 添加一个数据后，会先唤醒等待的获取数据的线程，再继续添加数据。
     */

    public static void main(String[] args) throws InterruptedException {

        /**
         * LinkedTransferQueue
         * 添加数据后如果没有人取走则进入阻塞状态持续等待
         * 取走的程序必须先于添加程序执行
         */


        LinkedTransferQueue<String> linkedTransferQueue = new LinkedTransferQueue<>();

        new Thread(() -> {
            try {
//                Thread.sleep(2000);
                System.out.println(linkedTransferQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();


        /**
         * 1.tryTransfer(E)：将元素立刻给消费者。准确的说就是立刻给一个等待接收元素的线程，如果没有消费者就会返回false，而不将元素放入队列。
         * 2.transfer(E)：将元素给消费者，如果没有消费者就会等待。
         * 3.tryTransfer(E,long,TimeUnit)：将元素立刻给消费者，如果没有就等待指定时间。失败返回false。
         * 4.hasWaitingConsumer()：返回当前是否有消费者在等待元素。
         * 5.getWaitingConsumerCount()：返回等待元素的消费者个数。
         */

        linkedTransferQueue.transfer("aaa");

/** ******************************************************************************************/
//        linkedTransferQueue.put("aaa");
//
//        new Thread(() -> {
//            try {
//                System.out.println(linkedTransferQueue.take());
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }).start();

    }

}
